#include <TFT_eSPI.h>
#include "kuan.h"
// ILI9488显示屏配置
#define TFT_DC    2     // GPIO2 (D4) - 数据/命令控制
#define TFT_MOSI  13    // GPIO13 (D7) - SPI数据发送
#define TFT_SCK   14    // GPIO14 (D5) - SPI时钟
#define TFT_CS    -1    // CS直接接GND，硬件固定选中
#define TFT_RST   -1    // RESET直接接3.3V，硬件固定高电平

// 创建TFT对象，指定ILI9488分辨率(480x320)
TFT_eSPI tft = TFT_eSPI(480, 320);

void setup() {
  // 初始化串口通信
  Serial.begin(115200);
  Serial.println("ILI9488显示屏测试程序启动");

  // 给显示屏足够的上电时间
  delay(1000);

  // 初始化显示屏
  tft.begin();

  // 设置屏幕旋转（可尝试0-3不同值）
  tft.setRotation(0);

  // 清屏为黑色
  tft.fillScreen(TFT_BLACK);

  // 显示标题
  tft.setTextColor(TFT_WHITE);
  tft.setTextSize(3);
  tft.setCursor(50, 20);
  tft.print("ILI9488 测试");

  // 显示引脚配置信息
  tft.setTextSize(1.5);
  tft.setTextColor(TFT_CYAN);
  tft.setCursor(20, 80);
  tft.print("引脚配置:");

  tft.setCursor(20, 110);
  tft.print("DC: GPIO2 (D4)");

  tft.setCursor(20, 140);
  tft.print("MOSI: GPIO13 (D7)");

  tft.setCursor(20, 170);
  tft.print("SCK: GPIO14 (D5)");

  tft.setCursor(20, 200);
  tft.print("CS: 直接接GND");

  tft.setCursor(20, 230);
  tft.print("RST: 直接接3.3V");

  // 等待3秒
  delay(3000);

  // 开始功能测试
  // testDisplayFunctions();
  // 显示图片
  displayImage(0, 0);  // 在(0,0)位置显示图片
  Serial.println("图片显示完成");
}

void loop() {
  // 循环显示彩虹效果
  //rainbowFill();
  delay(2000);
}

// 显示功能测试
void testDisplayFunctions() {
  // 颜色填充测试
  tft.fillScreen(TFT_RED);
  Serial.println("显示红色");
  delay(1000);

  tft.fillScreen(TFT_GREEN);
  Serial.println("显示绿色");
  delay(1000);

  tft.fillScreen(TFT_BLUE);
  Serial.println("显示蓝色");
  delay(1000);

  tft.fillScreen(TFT_BLACK);

  // 线条测试
  tft.drawLine(0, 0, tft.width() - 1, tft.height() - 1, TFT_YELLOW);
  tft.drawLine(tft.width() - 1, 0, 0, tft.height() - 1, TFT_YELLOW);
  Serial.println("绘制十字线");
  delay(1500);

  // 矩形测试
  tft.fillRect(50, 50, 100, 80, TFT_MAGENTA);
  tft.drawRect(70, 70, 100, 80, TFT_WHITE);
  Serial.println("绘制矩形");
  delay(1500);

  // 圆形测试
  tft.fillCircle(tft.width() / 2, tft.height() / 2, 60, TFT_CYAN);
  Serial.println("绘制圆形");
  delay(1500);

  tft.fillScreen(TFT_BLACK);
}
// 在指定位置显示图片
void displayImage(int x, int y) {
  // 确保图片在屏幕范围内
  if (x < 0 || y < 0 || x + IMAGE_WIDTH > tft.width() || y + IMAGE_HEIGHT > tft.height()) {
    Serial.println("图片位置超出屏幕范围");
    return;
  }

  // 设置显示窗口
  tft.setAddrWindow(x, y, x + IMAGE_WIDTH - 1, y + IMAGE_HEIGHT - 1);

  // 发送图片数据
  tft.startWrite();
  for (int i = 0; i < IMAGE_WIDTH * IMAGE_HEIGHT * 2; i += 2) {
    // 将两个8位数据组合成16位颜色值（RGB565格式）
    uint16_t color = (gImage_ser[i] << 8) | gImage_ser[i + 1];
    tft.pushColor(color);
  }
  tft.endWrite();
}
// 彩虹填充效果
void rainbowFill() {
  for (int y = 0; y < tft.height(); y++) {
    // 计算当前行的颜色（从红色到紫色渐变）
    uint16_t color = tft.color565(
                       sin(y * 0.02) * 127 + 128,
                       sin(y * 0.02 + 2) * 127 + 128,
                       sin(y * 0.02 + 4) * 127 + 128
                     );
    tft.drawFastHLine(0, y, tft.width(), color);
  }
  Serial.println("显示彩虹效果");
}
